import pymysql
import error

from DBUtils.PooledDB import PooledDB
from configurate import DATABASE


class MySQLOrm:
    # 定义连接池
    __pool = None

    def __init__(self):
        self.conn = MySQLOrm.__get_connection()
        self._cursor = self.conn.cursor()

    '''
        初始化线程连接池 返回连接
    '''

    @staticmethod
    def __get_connection():
        if MySQLOrm.__pool is None:
            MySQLOrm.__pool = PooledDB(
                creator=pymysql,  # 指定数据库连接驱动
                mincached=2,  # 初始化时,连接池至少创建的空闲连接,0表示不创建
                maxcached=5,  # 连接池中空闲的最多连接数,0和None表示没有限制
                maxshared=1,  # 连接池中最多共享的连接数量,0和None表示全部共享(其实没什么卵用)
                maxconnections=10,  # 连接池允许的最大连接数,0和None表示没有限制
                blocking=False,  # 连接池中如果没有可用共享连接后,是否阻塞等待,True表示等等,  False表示不等待然后报错
                maxusage=None,
                setsession=[],
                reset=True,
                failures=None,
                ping=1,
                **DATABASE)
        return MySQLOrm.__pool.connection()

    def get_all(self, sql, param=None):
        """
        @summary: 执行查询，并取出所有结果集
        @param sql:查询ＳＱＬ，如果有查询条件，请只指定条件列表，并将条件值使用参数[param]传递进来
        @param param: 可选参数，条件列表值（元组/列表）
        @return: result list(字典对象)/boolean 查询到的结果集
        """
        if param is None:
            count = self._cursor.execute(sql)
        else:
            count = self._cursor.execute(sql, param)

        if count > 0:
            desc = self._cursor.description
            result = [dict(zip([col[0] for col in desc], row)) for row in self._cursor.fetchall()]
        else:
            result = False
        return result, count

    def get_one(self, sql, param=None):
        """
        @summary: 执行查询，并取出第一条
        @param sql:查询ＳＱＬ，如果有查询条件，请只指定条件列表，并将条件值使用参数[param]传递进来
        @param param: 可选参数，条件列表值（元组/列表）
        @return: result list/boolean 查询到的结果集
        """
        if param is None:
            count = self._cursor.execute(sql)
        else:
            count = self._cursor.execute(sql, param)
        if count > 0:
            desc = self._cursor.description
            result = [dict(zip([col[0] for col in desc], row)) for row in self._cursor.fetchone()]
        else:
            result = False
        return result

    def get_many(self, sql, num, param=None):
        """
        @summary: 执行查询，并取出num条结果
        @param sql:查询ＳＱＬ，如果有查询条件，请只指定条件列表，并将条件值使用参数[param]传递进来
        @param num:取得的结果条数
        @param param: 可选参数，条件列表值（元组/列表）
        @return: result list/boolean 查询到的结果集
        """
        if param is None:
            count = self._cursor.execute(sql)
        else:
            count = self._cursor.execute(sql, param)
        if count > 0:
            desc = self._cursor.description
            result = [dict(zip([col[0] for col in desc], row)) for row in self._cursor.fetchmany(num)]
        else:
            result = False
        return result

    # 修改通用方法
    def update_common(self, sql, params):
        if self.conn and self._cursor:
            count = self._cursor.execute(sql, params)
            self.conn.commit()
            return count
        else:
            raise error.MyError(error.ErrorCode.MYSQL_NONE)

    # 新增通用方法
    def insert_common(self, sql, params):
        if self.conn and self._cursor:
            self._cursor.execute(sql, params)
            insert_id = int(self._cursor.lastrowid)
            self.conn.commit()
            return insert_id
        else:
            raise error.MyError(error.ErrorCode.MYSQL_NONE)

    def dispose(self):
        """
        @summary: 释放连接池资源
        """
        self._cursor.close()
        self.conn.close()
